home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / Xlib-main.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  11KB  |  287 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module Xlib-main.c                 */
  5. /*                                         */
  6. /*    main function for the Xlib interface                     */
  7. /*    written by Heiko Eissfeldt and Michael Bischoff                 */
  8. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  9. /*                                         */
  10. /*                                         */
  11. /*****************************************************************************/
  12. #ifdef useXlib
  13.  
  14. #include "X-pat.h"
  15. #include "version.h"
  16.  
  17. Window table, mainwindow;
  18. char *loadfilename = NULL;
  19.  
  20. static int audio = 1;
  21. int checksound(void) {
  22.     return audio;
  23. }
  24.  
  25. void cmd_LeavePat(void) {
  26.     play_sound("goodbye");
  27.     exit(0);
  28. }
  29.  
  30. static unsigned long color_to_pixel(const char *colorname) {
  31.     if (colorname) {
  32.     XColor color;
  33.     Colormap cmap;
  34.     cmap = DefaultColormap(dpy, screen);
  35.     color.flags = DoRed | DoGreen | DoBlue;
  36.     XAllocNamedColor(dpy, cmap, colorname, &color, &color);
  37.     return color.pixel;
  38.     } else
  39.     return BlackPixel(dpy, screen);
  40. }
  41.  
  42.  
  43. static void usage(const char *arg)
  44. {   fprintf(stderr, "usage: pat [options] [<seed> or <savedgame>]\n");
  45.     fprintf(stderr, "valid options are:\n");
  46.     fprintf(stderr, "-display <display>      set display\n");
  47.     fprintf(stderr, "-geometry <geometry>    set initial geometry\n");
  48. #ifdef LOADCARDS
  49.     fprintf(stderr, "-cards <cardset>        set cardset to external file\n");
  50. #endif
  51.     fprintf(stderr, "-xpmdir <directory>     for internal cardset: load xpm files\n");
  52.     fprintf(stderr, "-sound <0/1>            enables/disables sound\n");
  53.  
  54.     fprintf(stderr, "-tb <backgroundcolor>   set background color of tableau\n");
  55.     fprintf(stderr, "-cb <cardbackcolor>     set cardback color\n");
  56.     fprintf(stderr, "-markcolor <markcolor>  set color of card marks\n");
  57.     fprintf(stderr, "-markwidth <markwidth>  set width of card marks\n");
  58.     fprintf(stderr, "-bfont <fontname>       set font for buttons\n");
  59.     fprintf(stderr, "-sfont <fontname>       set font for status line\n");
  60.     fprintf(stderr, "-gapx, -gapy            set space between cards (0 to 20)\n");
  61.     fprintf(stderr, "\ngame customization:\n");
  62.     fprintf(stderr, "-rules <ruleset>        set rules to HM or Spider or Stairs\n");
  63.     fprintf(stderr, "-slots <slots>          set number of slots (2 to 60)\n");
  64.     fprintf(stderr, "-decks <decks>          set number of decks (1 to 9)\n");
  65.     fprintf(stderr, "-tmps <tmps>            set number of tmps (1 to 9)\n");
  66.     fprintf(stderr, "-faceup <faceup>        set initial deal parameter (0 to 20)\n");
  67.     fprintf(stderr, "-facedown <facedown>    set initial deal parameter (0 to 20)\n");
  68.     fprintf(stderr, "-jokers <jokers>        set number of jokers (do not use, it's too easy)\n");
  69.     fprintf(stderr, "-flips <flips>          limit number of flips (0 to 99)\n");
  70.     fprintf(stderr, "-relaxed 0|1            choose easy or hard variant\n");
  71.     fprintf(stderr, "-turn <turn>            set number of cards to turn (1 to 9)\n");
  72.     fprintf(stderr, "-rotations <num>        set maximum number of slot rotations (0 to 9)\n");
  73.     fprintf(stderr, "-p{0,1,2,3} <param>     set various rule parameters\n");
  74. #if 0    /* for insiders only */
  75.     fprintf(stderr, "-autolayout <0/1>       0: to avoid automatic re-layout at resize time\n");
  76.     fprintf(stderr, "-mem <0/1>              0: do not store card images at full depth internally\n");
  77.     fprintf(stderr, "-by <buttongap>         set button gap y size\n");
  78.     fprintf(stderr, "-bx <buttongap>         set button gap x size\n");
  79.     fprintf(stderr, "-cround <cornersize>    set size of round card corners (0 to 20)\n");
  80.     fprintf(stderr, "-bround <cornersize>    set size of round button corners (0 to 20)\n");
  81. #endif
  82.     if (arg)
  83.      fprintf(stderr,"argument \"%s\" caused this message\n", arg);
  84.     exit(EXIT_FAILURE);
  85. }
  86.  
  87. static void init_display(const char *display)
  88. {
  89.     if ((dpy = XOpenDisplay(display)) == NULL)    {
  90.     fprintf(stderr,"Can't open display %s\n", 
  91.         (display ? display : getenv("DISPLAY")));
  92.     exit(EXIT_FAILURE);
  93.     }
  94.     screen = DefaultScreen(dpy);
  95.     graphic.is_color = (DisplayCells(dpy, screen) > 2);
  96. #ifdef DEBUG
  97.     XSynchronize(dpy, True);
  98. #endif
  99. }
  100.  
  101.  
  102.  
  103. /* enum { String, Number, Bool } argtype; */
  104. #define String 0
  105. #define Number 1
  106. #define Self   2
  107.  
  108. int main(int argc, char **argv)
  109. {   int i;
  110.     long seed = -1L;
  111.     const char *restoregame = NULL;
  112.     static const char *display = NULL, *cmdname;
  113.  
  114.     /* these must be static, since their address is taken */
  115.     static int slots, faceup, facedown, decks, p0, p1, p2, p3; /* rules customization */
  116.     static int linewidth, cround, bround, gapx, gapy, bx, by, autolayout, mem;
  117.     static int tmps, arrw, arrh, jokers, sound = 1;
  118.     static const char *geometry, *ruleset, *cbcolor, *bkcolor = "DarkKhaki";
  119.     static const char *buttonfont, *statusfont, *cardset = NULL, *markcolor, *xpmdir;
  120.     static const char *arrowcolor;
  121.  
  122. static struct option {
  123.     const char *option;
  124.     const char *resource;
  125.     const char *value;
  126.     void *where;
  127.     int type;
  128.     int minval;       /* only for Number */
  129.     int maxval;       /* only for Number */
  130.     const char *cmdarg;
  131. } options[] = {
  132.     /* first option must be -rules */
  133.     { "-rules",        "Rules",         "Gypsy",     &ruleset,   String },
  134.     { "-autolayout","AutoLayout",    "1",         &autolayout,Number,  0,  1 },
  135.     { "-mem",       "Mem",           "1",         &mem,       Number,  0,  1 },
  136.     { "-xpmdir",    "XpmDir",        NULL,        &xpmdir,    String },
  137. #ifdef LOADCARDS
  138.     { "-cards",     "Cards",         NULL,        &cardset,   String },
  139. #endif
  140.     { "-slots",     "Slots",         NULL,        &slots,     Number, -1, MAXPILES },
  141.     { "-flips",     "Flips",         NULL,        &p1,          Number, -1,999 },
  142.     { "-turn",      "Turn",         NULL,        &p2,        Number, -1,  9 },
  143.     { "-relaxed",   "relaxed",         NULL,        &p0,        Number, -1,  9 },
  144.     { "-flips",     "flips",         NULL,        &p1,        Number, -1, 99 },
  145.     { "-turn",      "turn",         NULL,        &p2,        Number, -1,  9 },
  146.     { "-rotations", "rotations",     NULL,        &p3,        Number, -1,  9 },
  147.     { "-decks",     "Decks",         NULL,        &decks,     Number, -1,  9 },
  148.     { "-tmps",      "Tmps",          NULL,        &tmps,      Number, -1, 16 },
  149.     { "-faceup",    "Faceup",        NULL,        &faceup,    Number, -1, 16 },
  150.     { "-facedown",  "Facedown",      NULL,        &facedown,  Number, -1, 16 },
  151.     { "-jokers",    "Jokers",          NULL,        &jokers,    Number, -1, 16 },
  152.     { "-cround",    "CardRound",     NULL,        &cround,    Number, -1, 99 },
  153.     { "-bround",    "ButtonRound",   "4",         &bround,    Number,  0, 20 },
  154.     { "-sound",     "Sound",         "1",         &sound,     Number,  0,  1 },
  155.     { "-bx",        "ButtonGapX",    "4",         &bx,        Number,  0, 99 },
  156.     { "-by",        "ButtonGapY",    "4",         &by,        Number,  0, 99 },
  157.     { "-aw",        "ArrowWidth",    NULL,        &arrw,      Number, -1, 30 },
  158.     { "-ah",        "ArrowHeight",   NULL,        &arrh,      Number, -1, 30 },
  159.     { "-gapx",      "GapX",          "4",         &gapx,      Number,  0, 99 },
  160.     { "-gapy",      "GapY",          "4",         &gapy,      Number,  0, 99 },
  161.     { "-rng",       "Rng",         "1",      &rng,       Number,  0,  1 },
  162.     { "-cb",        "CardbackColor", "SlateGrey", &cbcolor,   String },
  163.     { "-tb",           "TableColor",    "DarkKhaki", &bkcolor,   String },
  164.     { "-markcolor", "MarkColor",     NULL,        &markcolor, String },
  165.     { "-markwidth", "MarkWidth",     "999",       &linewidth, Number,  1,999 },
  166.     { "-arrowcolor","ArrowColor",    "Gold",      &arrowcolor,String },
  167.     { "-bfont",     "ButtonFont",    NULL,        &buttonfont,String },
  168.     { "-sfont",     "StatusFont",    "fixed",     &statusfont,String },
  169.     { "-geometry",  "Geometry",      NULL,        &geometry,  String },
  170.     { "-display",   NULL,            NULL,        &display,   String }
  171. };
  172. #define NUMOPTIONS      (sizeof(options) / sizeof(options[0]) - 1)
  173.  
  174.     for (i = 0; i <= NUMOPTIONS; ++i)
  175.         options[i].cmdarg = NULL;
  176.  
  177.     if (!(cmdname = strrchr(argv[0], '/')))
  178.     cmdname = argv[0];
  179.     else
  180.     ++cmdname;
  181.     if (strncmp(cmdname, "xpat", 4))
  182.     options[0].cmdarg = cmdname;
  183.  
  184.     for (i = 1; i < argc - 1; ++i) {    /* merge command line options */
  185.     int j;
  186.     if (*argv[i] != '-')
  187.         break;
  188.     for (j = 0; j <= NUMOPTIONS; ++j) {
  189.         if (!strcmp(argv[i], options[j].option)) {
  190.         options[j].cmdarg = options[j].type == Self ? "1" : argv[++i];
  191.         break;
  192.         }
  193.         }
  194.         if (j > NUMOPTIONS)
  195.         usage(argv[i]);
  196.     }
  197.     if (i < argc) {        /* seed or savegame left */
  198.     if (i != argc - 1)
  199.         usage(argv[i]);
  200.     if (isdigit(*argv[i])) {
  201.         seed = atol(argv[i]);
  202.         if (seed < 0L || seed >= 1000000000L)
  203.         usage(argv[i]);
  204.     } else
  205.         if (*argv[i] != '-')
  206.         restoregame = loadfilename = argv[i];
  207.         else
  208.         usage(argv[i]);
  209.     }
  210.     display = options[NUMOPTIONS].cmdarg;
  211.  
  212.     init_display(display);        /* connect to X-server */
  213.  
  214.     for (i = 0; i < NUMOPTIONS; ++i) {  /* get resources from server */
  215.     char *s;
  216.         if (options[i].cmdarg)
  217.         options[i].value = options[i].cmdarg;
  218.         else if ((s = XGetDefault(dpy, "XPat", options[i].resource)))
  219.         options[i].value = s;
  220.     }
  221.  
  222.     for (i = 0; i < NUMOPTIONS; ++i) {  /* value-check Numbers */
  223.     int n;
  224.     struct option *o;
  225.     o = options + i;
  226.         if (o->type == Number) {
  227.         n = o->value ? atoi(o->value) : -1;
  228.         if (n < o->minval || n > o->maxval) {
  229.         char s[100];
  230.         sprintf(s, "argument to option \"%s\" / resource \"%s\"",
  231.                     o->option, o->resource);
  232.                 usage(s);
  233.             }
  234.             *(int *)(o->where) = n;
  235.         } else if (o->type == Self) {
  236.             *(int *)(o->where) = 1;
  237.         } else /* type == String */
  238.             *(const char **)(o->where) = o->value;
  239.     }
  240.     if (!sound)
  241.     audio = 0;
  242.  
  243.     if (restoregame &&
  244.        (decks != -1 || slots != -1 || faceup != -1 || facedown != -1))
  245.       fprintf(stderr, "warning: customization parameters are ignored\n");
  246.  
  247.  
  248.     {  const char *s; langdir = (s = getenv("LANG")) ? s : ""; }
  249.     read_message_file("messages");
  250.     read_keyboard_file("keys");
  251.  
  252.     graphics_control(Disable);
  253.     if (restoregame)
  254.         load_game(restoregame);
  255.     else {
  256.     new_rules(ruleset, decks, slots, faceup, facedown, jokers, tmps, p0, p1, p2, p3);
  257.     newgame(seed);
  258.     }
  259.  
  260.     init_gfx();
  261.     init_fonts(statusfont, buttonfont);    /* make GCs */
  262.     init_cards(cardset, cround, cround, color_to_pixel("Red3"), color_to_pixel(cbcolor),
  263.            mem, xpmdir);    /* set size of cards, make pixmaps */
  264.     init_windows(argc, argv, geometry, gapx, gapy, bround, bround,
  265.     bx, by, autolayout, bkcolor); /* size window */
  266.     init_mark(color_to_pixel(markcolor), linewidth);    /* initialize card marks */
  267.     init_arrow(arrowcolor, arrw, arrh);
  268.  
  269.     graphics_control(Enable);
  270.     init_layout();            /* position the piles in a nice way */
  271.     for (i = 0; i < game.numpiles; ++i)
  272.     pile_resize(i);
  273.     /* refresh_screen(); */
  274.     show_message(TXT_WELCOME, VERSION);
  275.     mainwindow = table;
  276.     event_loop();        /* does not return */
  277.     return 0;            /* keep compiler happy */
  278. }
  279.  
  280. void Force_Resize(XSize_t w, XSize_t h) {
  281.     /* for Xlib, we can use this size. It does include space for buttons and messagebox */
  282.     XResizeWindow(dpy, mainwindow, w, h);
  283.     /* or should XSetWMSizeHints() be used? */
  284. }
  285. #endif
  286.  
  287.